当前位置: 首页 > news >正文

兰州企业网站排名优化手机网站建立

兰州企业网站排名优化,手机网站建立,百度搜索网站打开错误,官方你网站建设策略目录 一. PCB 的概念 1. 为什么需要PCB 2. PCB的属性 二. task struct 1. task struct 介绍 2. 查看进程指令 3. PID 4. PPID 父进程是什么#xff1f; 为什么要有父进程#xff1f; 5. fork 创建子进程 1) fork 后的现象 为什么会打印两次#xff1f; 2) 的返…目录 一. PCB 的概念 1. 为什么需要PCB 2. PCB的属性 二. task struct 1. task struct 介绍 2. 查看进程指令 3. PID 4. PPID 父进程是什么 为什么要有父进程 5. fork 创建子进程 1) fork 后的现象 为什么会打印两次 2) 的返回值 getpid petppid 3) fork 如何办到 三. 总结 一. PCB 的概念 在我们的操作系统中如果我们想要运行一个程序那么我们显然是需要将程序加载到内存中的所以我们可以先不怎么准确的理解一下进程是什么——加载到内存中的程序。 更为官方的概念是这样的进程 PCBProcess Control Block进程控制块是操作系统中用于描述和管理进程的数据结构。每个正在运行的进程都有一个对应的进程 PCB。 那么我们首先谈论一下为什么需要进程 1. 为什么需要PCB 我们前面说了我们的进程就是一个程序加载到内存那么我们的系统中显然是不可能只有一个进程的因为我们需要运行很多软件进程所以我们是需要对这么多的进程需要进行管理的而我们的操作系统如何管理   先描述再组织。 那么我们如何描述一个进程呢通过用数据结构来描述进程的特定的属性来描述进程所以我们用来描述进程的数据结构就叫做PCB而我们的操作系统也就是通过管理PCB来管理我们的进程。 但是我们上面一直是在说PCB那么PCB就等于进程吗 这里说一下其实PCB并不等于进程我们说了PCB只是系统给我们创建的一个用来描述进程的控制块但是我们不仅仅需要用来描述我们还是需要我们自己程序的代码和数据所以我们的进程应该是 进程 PCB 代码和数据 根据上面说的我们的PCB就是用来描述我们的进程的一个控制块而PCB的作用就是方便操作系统对我们的进程进行管理。  2. PCB的属性 我们现在知道PCB就是系统用来描述进程的一个数据结构那么既然是一个数据结构里面当然是有各种关于进程的属性的我们下面看一下关于进程的各种属性。 进程标识符Process ID用于唯一标识一个进程。程序计数器Program Counter记录当前进程正在执行的指令位置。寄存器状态Register State包括通用寄存器、堆栈指针和程序状态字等寄存器的内容。进程状态Process State表示进程的当前状态如运行、就绪、等待等。内存信息包括进程的代码段、数据段和堆栈段的起始地址和大小。调度信息包括进程的优先级、调度算法使用的时间片大小等。进程控制信息包括父进程标识符、子进程标识符、打开的文件列表等。 这上面只是笼统的介绍一下后面会详细说的~ 二. task struct 前面说的是大多数操作系统的一个概念但是如果我们想要学习操作系统那么我们必须要学习的是一款具体的操作系统我们这里说的就是 linux 1. task struct 介绍 我们这里说的 task struct 就是 PCB 而PCB是所有操作系统里面进程的一个叫法而我们的 task struct 是一款具体的操作系统linux里面的PCB的一个叫法。 task struct 里面的属性和PCB里面的都是差不多的但是肯定是有差别的。 下面我们就先简单的看一下 linux 里面的进程 2. 查看进程指令 指令ls /proc查看所有进程 指令ps axj (查看所有进程) 我们现在写一个死循环然后我们执行该程序在执行的时候我们的该程序会被加载到内存然后被执行我们使用命令查看该进程 测试代码 #includestdio.h #includeunistd.hint main() {while(1){printf(I am a process...\n);sleep(2);}return 0; }上面是 ps axj 查看下面是 ls /proc查看  其实这样看的管感并不太好我们还可以使用 grep 命令来查看 [lxyhecs-165234 linux2]$ ps axj | head -1 ps axj | grep myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND 18563 18611 18611 18563 pts/1    18611 S    1000   0:00 ./myprocess 18169 18859 18858 18169 pts/0    18858 D    1000   0:00 grep --colorauto myprocess前面的那个是为了查看第一行 我们看到我们查到的内容里面有几个属性我们这里先值说一个PID进程的标识符也就是在系统中表示唯一的一个进程 既然我们现在知道了PID那么我们看到 ls /proc查看到的里面的那些数字其实就是PID 我们可以通过 ls /proc 查看一下我们的 myproc 进程然后我们关掉我们的程序后在查看一下 [lxyhecs-165234 linux2]$ ls /proc | grep 18611 18611[lxyhecs-165234 linux2]$ ls /proc | grep 18611 [lxyhecs-165234 linux2]$  我们看到我们第一次查到了然后关掉程序后就查看不到了 我们继续启动程序然后我们查看该程序 [lxyhecs-165234 linux2]$ ps axj | grep myprocess 18563 18940 18940 18563 pts/1    18940 S    1000   0:00 ./myprocess 18169 18942 18941 18169 pts/0    18941 R    1000   0:00 grep --colorauto myprocess [lxyhecs-165234 linux2]$ ls /proc/18940 -dl dr-xr-xr-x 9 lxy lxy 0 Jul 12 19:04 /proc/18940 [lxyhecs-165234 linux2]$  我们看到我们的 18940 是一个文件那么我们打开看一下里面有一些什么内容 lxyhecs-165234 linux2]$ cd /proc/18940 [lxyhecs-165234 18940]$ ll total 0 dr-xr-xr-x 2 lxy lxy 0 Jul 12 19:06 attr -rw-r--r-- 1 lxy lxy 0 Jul 12 19:06 autogroup -r-------- 1 lxy lxy 0 Jul 12 19:06 auxv -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 cgroup --w------- 1 lxy lxy 0 Jul 12 19:06 clear_refs -r--r--r-- 1 lxy lxy 0 Jul 12 19:04 cmdline -rw-r--r-- 1 lxy lxy 0 Jul 12 19:06 comm -rw-r--r-- 1 lxy lxy 0 Jul 12 19:06 coredump_filter -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 cpuset lrwxrwxrwx 1 lxy lxy 0 Jul 12 19:06 cwd - /home/lxy/108/linux2 -r-------- 1 lxy lxy 0 Jul 12 19:06 environ lrwxrwxrwx 1 lxy lxy 0 Jul 12 19:06 exe - /home/lxy/108/linux2/myprocess dr-x------ 2 lxy lxy 0 Jul 12 19:04 fd dr-x------ 2 lxy lxy 0 Jul 12 19:06 fdinfo -rw-r--r-- 1 lxy lxy 0 Jul 12 19:06 gid_map -r-------- 1 lxy lxy 0 Jul 12 19:06 io -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 limits -rw-r--r-- 1 lxy lxy 0 Jul 12 19:06 loginuid dr-x------ 2 lxy lxy 0 Jul 12 19:06 map_files -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 maps -rw------- 1 lxy lxy 0 Jul 12 19:06 mem -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 mountinfo -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 mounts -r-------- 1 lxy lxy 0 Jul 12 19:06 mountstats dr-xr-xr-x 5 lxy lxy 0 Jul 12 19:06 net dr-x--x--x 2 lxy lxy 0 Jul 12 19:06 ns -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 numa_maps -rw-r--r-- 1 lxy lxy 0 Jul 12 19:06 oom_adj -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 oom_score -rw-r--r-- 1 lxy lxy 0 Jul 12 19:06 oom_score_adj -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 pagemap -r-------- 1 lxy lxy 0 Jul 12 19:06 patch_state -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 personality -rw-r--r-- 1 lxy lxy 0 Jul 12 19:06 projid_map lrwxrwxrwx 1 lxy lxy 0 Jul 12 19:06 root - / -rw-r--r-- 1 lxy lxy 0 Jul 12 19:06 sched -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 schedstat -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 sessionid -rw-r--r-- 1 lxy lxy 0 Jul 12 19:06 setgroups -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 smaps -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 stack -r--r--r-- 1 lxy lxy 0 Jul 12 19:04 stat -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 statm -r--r--r-- 1 lxy lxy 0 Jul 12 19:04 status -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 syscall dr-xr-xr-x 3 lxy lxy 0 Jul 12 19:06 task -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 timers -rw-r--r-- 1 lxy lxy 0 Jul 12 19:06 uid_map -r--r--r-- 1 lxy lxy 0 Jul 12 19:06 wchan这里面我们介绍两个字段 exe我们前面说了我们的程序就是 PCB 代码和数据而我们的 exe就是软连接指向我们的代码和数据而我们的代码和数据就在后面的那条路劲下cwd我们的一个程序里面其实有一个默认的路劲就是当前目录我们的程序在哪里执行我们的默认当前目录就在哪个目录下 3. PID 在操作系统中每一个进程都是由自己独立的编号的而在PCB中进程的编号就是 PID, PID 可以表示某一个操作系统中的特定的一个进程。 现在我们自己编写一个程序我们的程序之打印 hello world下面查看该进程的 PID #includestdio.h #includeunistd.hint main() {while(1){printf(hello world\n);sleep(1);}return 0; }查看进程的前面已经说过了下面直接查看一下。 [lxyhecs-165234 linux3]$ ps axj | head -1 ps axj | grep procPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6468 6552 6552 6468 pts/1 6552 S 1000 0:00 ./proc 这里使用 head -1 来显示第一行的信息第一行可以看到 PID 而该进程的 PID 就是 6552 4. PPID 这里先介绍 PPID 是什么PPID 就是 该进程的父进程。 父进程是什么 父进程就是创建该进程的进程就叫做父进程而在 linux 中进程的创建时有两种方法的 第一种就是 ./程序名然后操作系统会帮助我们将该进程的代码和数据加载到内存中然后操作系统也会帮我们为该进程创建对应的 tash_struct 第二种就是自己创建操作系统为我们提供一部分接口而用户就可以使用这一部分接口来手动的创建进程(fork函数)。 所以系统中的进程都是由别的进程创建的或者是自己手动创建的而当用户 ./ 执行一个程序的时候其实也是由父进程的而这个父进程就是 bash 这个之前说过bash 在 这里就是命令行解释器当 bash 察觉到我们是要启动一个进程的时候就是 bash 帮助用户创建进程而这里的进程的父进程也就是 bash。 下面查看一下刚才的 6468 的进程这里可以看到就是 bash [lxyhecs-165234 linux3]$ ps axj | head -1 ps axj | grep 6468PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6467 6468 6468 6468 pts/1 6468 Ss 1000 0:00 -bash为什么要有父进程 这个我们在下一期说。 5. fork 创建子进程 前面说了 fork 可以创建子进程那么怎么创建呢 fork 是一个系统接口所以如果当我们不明白的时候我们可以使用 man 进程查看该函数的信息。 [lxyhecs-165234 linux3]$ man 2 forkNAMEfork - create a child processSYNOPSIS#include unistd.hpid_t fork(void);RETURN VALUEOn success, the PID of the child process is returned in the parent, and 0 isreturned in the child. On failure, -1 is returned in the parent, no childprocess is created, and errno is set appropriately.这里没有全部显示出来想了解的可以自己查看。 这里可以看到该函数的作用就是创建一个子进程然后下面就是该函数的返回值和头文件而该函数成功的话有两个返回值 一个是给父进程返回子进程的 PID 另一个是给子进程返回0如果失败的话就返回 -1. 下面看一下使用。 1) fork 后的现象 #includestdio.h #includeunistd.hint main() {printf(begin....\n);fork();printf(end....\n);sleep(1);return 0; }运行....  [lxyhecs-165234 linux3]$ ./proc begin.... end.... end....这里是运行后的结果看到 end 打印的两次。 为什么会打印两次 第一次解释 因为 fork 后就会创建一个进程然后这时候就会有两个执行流执行所以说 end 被打印了两次 2) 的返回值 这里继续编写一段代码。 #includestdio.h #includeunistd.h #includesys/types.hint main() {pid_t id fork();if(id 0){// 子进程while(1){printf(I am a child... \n);sleep(1);}}else if(id 0){// 父进程while(1){ printf(I am a father... \n);sleep(1);}}else{//创建失败}return 0; }然后我们运行看一下结果。 [lxyhecs-165234 linux3]$ ./proc I am a father... I am a child... I am a father... I am a child... I am a father... I am a child... 结果就是我们该程序不仅在打印 father 还在打印 child 我们该进程不仅进了 if 还进了 else if所以为什么会有这个现象呢 下面在看一下查看到的进程。 [lxyhecs-165234 linux3]$ ps axj | head -1 ps axj | grep procPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6468 7387 7387 6468 pts/1 7387 S 1000 0:00 ./proc7387 7388 7387 6468 pts/1 7387 S 1000 0:00 ./proc这里看到确实是这样第一个是父进程第二个是子进程子进程的 PPID 就是父进程的 PID 在下面开始之前先介绍两个函数。 getpid petppid NAMEgetpid, getppid - get process identificationSYNOPSIS#include sys/types.h#include unistd.hpid_t getpid(void);pid_t getppid(void);DESCRIPTIONgetpid() returns the process ID of the calling process. (This is often usedby routines that generate unique temporary filenames.) 这就是两个函数的介绍我这里在简单介绍一下这两个函数一个是返回PID 另一个是返回 PPID 其中谁调用该函数就返回谁的 PID 和 PPID。 这里为什么会有上面的结果 fork 有两个返回值fork  后又两个进程在执行代码 3) fork 如何办到 概念铺设进程之间是互相独立的。进程是有自己的代码和数据的所以进程之间是互不干扰的。 fork为何会有两个返回值首先我们相信 fork 会帮我们创建好子进程而fork 是有返回值的那么当fork执行到 return 的时候主要的逻辑就执行结束了所以返回之前就已经创建好了所以就可以返回两个返回值。fork 后为什么一个 id 里面看起来是有两份数据在 fork 创建进程后子进程是和父进程共享代码的因为子进程没有自己独立的代码而且代码是不会被修改的所以没有必要拷贝一份代码。子进程和父进程的数据是“写时拷贝”的就是当子进程不修改数据的时候那么和父进程时共用同一份数据那么当子进程修改数据后会为子进程单独拷贝该数据到子进程的地址空间里面所以就实现了由看起来时一份数据但是存储了两份数值。 三. 总结 PCB 就是一个用来描述进程的一个控制块操作系统通过对 PCB 进行管理来达到对进程进行管理。task_struct 是 linux 中的 PCBtash_struct 中有很多属性用来描述该PCB中的信息其中PID 就是该进程控制块的编号PPID 就是该进程的父进程fork 是用户自己创建进程的一个手段fork 通过不同的返回值来进行分流达到父进程和子进程可以区分来完成不同的工作。
http://www.zqtcl.cn/news/658484/

相关文章:

  • 做网站不会框架网站开发逻辑图
  • 东莞网站制作个性化宜都网站建设
  • 空壳网站查询网络服务提供者不履行法律、行政法规
  • 付费阅读网站代码做网站需要什么软件
  • 泗阳网站设计外贸网站特点
  • 国外logo设计网站推荐网页浏览器证书失效怎么修复
  • asp.net建立手机网站校园网站设计代码
  • 网站图标怎么下载肇庆新农村建设内容在哪个网站
  • 上海建站哪家好临沂建设工程质量 监督网站
  • 中国建设银行网站地图上海最新新闻热点事件
  • wordpress4.95淘宝优化标题都是用什么软件
  • 大网站用wordpress吗网站广告费怎么做分录
  • 江西建设安全网站会展平面设计主要做什么
  • 阿里巴巴免费做网站吗企业商务网站建设策划书
  • 广州网站制作哪家专业深圳网站制作开发
  • 网站icp备案管理系统个人网站源代码
  • 西安网站建设公司云网wordpress 文章分类
  • 长沙优化网站服务r18cn wordpress
  • 建材网站设计延安网站建设电话
  • 做视频网站犯法么华为公司网站建设案例分析
  • 陕煤化建设集团网站矿建二公司网站制作系统
  • 网站建设类别wordpress下载付费
  • 廊坊做网站的成都网站建设网站建设
  • 如何自己开网站网络服务检测与维护
  • 古镇网站建设熊掌号专业网站开发哪里有
  • 专业做网站服务上海网站开发哪家好
  • 科普重庆网站浙江网站开发
  • 怎么搭建自己的网站后台邹城网站建设哪家好
  • 二手房在哪个网站做合同wordpress 局域网 慢
  • 全包胶衣网站wordpress 3.1