`
freewxy
  • 浏览: 336771 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Linux进程创建和结束

阅读更多

 

Linux中,进程的创建由系统调用forkvfork完成。它们生成一个子进程并且子进程是父进程的一个复制品。

  Fork系统调用对应的kernel函数是sys_fork,此函数简单的调用kernel函数do_fork。一个简化版的do_fork执行如下:

(1)alloc_pid()。给新的进程分配一个新的pid,即进程号

(2)copy_process()此函数会做fork的大部分事情,它主要完成讲父进程的运行环境复制到新的子进程,比如信号处理、文件描述符和进程的代码数据等。

(3)wake_up_new_task()。计算此进程的优先级和其他调度参数,将新的进程加入到进程调度队列并设此进程为可被调度的,以后这个进程可以被进程调度模块调度执行。

 

  简化的copy_process()流程:

(1)     dup_task_struct()。分配一个新的进程控制块,包括新进程在kernel中的堆栈。新的进程控制块会复制父进程的进程控制块,但是因为每个进程都有一个kernel堆栈,新进程的堆栈将被设置成新分配的堆栈。

(2)初始化一些新进程的统计信息,如此进程的运行时间

(3)copy_semundo()复制父进程的semaphore undo_list到子进程。

(4)copy_files()copy_fs()。复制父进程文件系统相关的环境到子进程

(5)copy_sighand()copy_signal()。复制父进程信号处理相关的环境到子进程。

(6)copy_mm()。复制父进程内存管理相关的环境到子进程,包括页表、地址空间和代码数据。

(7)copy_thread()。设置子进程的执行环境,如子进程运行时各CPU寄存器的值、子进程的kernel栈的起始地址。

(8)sched_fork()。设置子进程调度相关的参数,即子进程的运行CPU、初始时间片长度和静态优先级等。

(9)将子进程加入到全局的进程队列中

(10)设置子进程的进程组ID和对话期ID等。

简单的说,copy_process()就是将父进程的运行环境复制到子进程并对某些子进程特定的环境做相应的调整。

 

   应用程序使用系统调用exit()来结束一个进程,此系统调用接受一个退出原因代码,父进程可以使用wait()系统调用来获取此代码,从而知道子进程退出的原因。对应到kernel,此系统调用sys_exit_group(),它的基本流程如下:

(1)将信号SIGKILL加入到其他线程的信号队列中,并唤醒这些线程。

(2)此线程执行do_exit()来退出。

do_exit()完成线程退出的任务,其主要功能是将线程占用的系统资源释放,do_exit()的基本流程如下:

(1)将进程内存管理相关的资源释放

(2)将进程ICP semaphore相关资源释放

(3)__exit_files()__exit_fs()。将进程文件管理相关的资源释放。

(4)exit_thread()。只要目的是释放平台相关的一些资源。

(5)exit_notify()。在Linux中进程退出时要将其退出的原因告诉父进程,父进程调用wait()系统调用后会在一个等待队列上睡眠。

(6)schedule()。调用进程调度器,因为此进程已经退出,切换到其他进程。

0
0
分享到:
评论

相关推荐

    操作系统进程创建与并发实验报告及源码

     利用fork()函数编写一个程序,要求父进程创建两个子进程,父进程、子进程并发执行,输出并发执行的消息,如: 父进程正在执行….. 子进程1正在执行….. 子进程2正在执行….. 一段时间后,父进程杀死子进程,然后...

    进程控制(Linux)操作系统实验

    设计并实现 Unix 的 “time” 命令。 “mytime” 命令通过命令行参数接受要运行的程序,创建一个独立的进程来运行该程序,并记录程序运行的...•使用 wait() 等待新创建的进程结束 •调用 gettimeofday() 来获取时间

    1操作系统实验五.docx

    父子进程都使用父进程创建的共享存储区进行通信。 由生产者进程发送数值1~10到由5个缓冲区组成的共享内存中,两个消费者进程轮流接受并输入这10个数据,同时将两个消费者进程对读出的所有数据进行累加求和。 3个子...

    Linux系统下C语言编程--进程的创建

    Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命 令.那么操作系统是怎么实现多用户的环境呢?在现代的操作系统里面,都有程序和进程的...本文为大家介绍Linux系统下C语言编程--进程的创建。

    电子科大操作系统实验课Linux通过管道实现进程间通信

    在Linux系统中使用系统调用fork()创建两个子进程,使用系统调用pipe()建立一个管道,两个子进程分别向管道各写一句话: Child process 1 is sending a message! Child process 2 is sending a message! 而父进程则...

    操作系统实验,进程控制

    操作系统实验,压缩包中包括Linux和windows进程控制源代码及实验报告。 进程控制实验题目: 设计并实现Unix的“time”命令。“mytime”命令通过命令行参数接受要运行的程序,创建一个独立的进程来运行该程序,并...

    02-Linux系统编程-进程

    Linux进程,进程创建,进程的结束,进程的回收等相关的介绍。

    Linuxc高级编程之进程(带代码截图)

    1.打印当前所有环境变量的值; 2.添加新的环境变量NEWENV=first; 3.修改环境变量NEWENV的值为second;...在父进程中获取已经结束的子进程的状态信息,打印该信息,并且打印结束的子进程的进程号。

    操作系统课程设计进程控制

    在Windows下实现: 使用CreateProcess()来创建进程 使用WaitForSingleObject()在“mytime”命令和新创建的进程之间同步 调用GetSystemTime()来获取时间 ...使用wait()等待新创建的进程结束 调用gettimeofday()来获取时间

    操作系统课程设计—进程控制

    1. 创建进程 CreateProcess() 调用的核心参数是可执行文件运行时的文件名及其命令行。下表详细地列出了每个参数的类型和名称。 CreateProcess() 函数的参数 2. 正在运行的进程 如果一个进程拥有至少一个执行...

    操作系统实验,进程控制mytime

    操作系统实验,压缩包中包括Linux和windows进程控制源代码及实验报告。 进程控制实验题目: 设计并实现Unix的“time”命令。“mytime”命令通过命令行参数接受要运行的程序,创建一个独立的进程来运行该程序,并...

    linux基本命令.txt

    可以帮助喜欢运维的人员快速了解linux系统运行,解决开发人员对linux系统的误区

    linux实现软中断通信和管道通信报告(含代码)

    使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上发出的中断信号(即按delete键),当父进程接收到这两个软中断的某一个后,父进程用系统调用kill()向两个子进程分别发出整数值为16和17...

    操作系统课程实验.rar

    由父进程创建一个管道,然后再创建 3 个子进程,并由这三个子进程利用管道与父进程 之间进行通信:子进程发送信息,父进程等三个子进程全部发完消息后再接收信息。通信的 具体内容可根据自己的需要随意设计,要求能...

    详解Linux中的守护进程

    Linux系统启动时会启动很多系统服务进程,这些系统服 务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运⾏结束或⽤户注销时终止,但系统服务进程不受用户登录注销的影响,它们⼀直...

    操作系统上机实验报告-进程的管道通信

    在Linux系统下实现进程从创建到终止的全过程,从中体会进程的创建过程、父进程和子进程之间的关系、进程状态的变化、进程之间的互斥、同步机制、进程调度的原理和以管道为代表的进程间的通信方式的实现。 2. 内容及...

    LINUX查看进程的4种方法(小结)

    ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。...

    Linux下进程及多线程编程

    在Linux下进行多线程编程时,首先要创建线程,然后,要掌握线程的结束方法,线程的参数传递及线程的标识等基本概念,在此基础上,熟悉线程互斥锁的概念及其编程。

    windows进程控制mttime

    设计并实现Unix的"time”命令...使用wait()等待新创建的进程结束 调用gettimeofday()来获取时间 mytime的用法: $ mytime.exe program1 $ mytime.exe program2 t t为时间参数 显示结果: **小时**分**秒**毫秒**微秒

    linux下的守护进程和系统日志

    Unix/Linux中的守护进程(Daemon)类似于Windows中的后台服务进程,一直在后台长时间运行的进程。它通常在系统启动后就运行,没有控制终端,也无法和前台的用户交互,在系统关闭时才结束。Daemon程序一般都作为服务...

Global site tag (gtag.js) - Google Analytics