在Linux系统下实现进程,Linux进程学习(一)之Linux进程的基本知识和实现

最近一周学习了Linux 进程编程的知识,现对其总结如下。

在第一部分中我们先对进程的基本概念以及在Linux 中是如何来现实进程的进行介绍

Tiger-John说明 :

许多人在学习中只注重如何编程,却忘了注重原理,不去深究其基本原理。其实操作系统的原理就好比金庸武侠小说的内功一样,而所有的具体实现如:Linux操作系统,uc/os操作系统都只是武功招式而已。如果我们内功学的很好的话,再来学习具体的实现过程是很快的。而且也会对其知识有更加本质的了解。

一.进程的基本概念: 1.为什么计算机操作系统要引进进程: 在操作系统中引入进程的目的是为了使多个程序并发执行 ,以改善资源利用率及提高系统吞吐量。 2.进程的概念: 进程是程序的一次执行,进程是拥有资源的最小单位和调度单位(在引入线程的操作系统中,线程是最小的调度单位) 3.进程由什么组成 进程由进程控制块(PCB),数据,程序3部分组成。其中PCB是进程的灵魂。 4.进程的状态: 进程的三种最基本的状态是:运行态(running),就绪态(readying),阻塞态(block) 5.进程和程序的区别: 进程和程序的主要区别是进程是动态的,程序是静态的。进程时运行中的程序,程序是一些保存在硬盘上的可执行的代码。 6.进程的优点和缺点

(任何事物都是有其两面性。我们在学习的时候要注意其优点和缺点。人们也就再发现事物缺点的过程中,不断的去改善它,从而引入了新的事物。在操作系统的学习过程中,我们会发现很多这样的例子。人们在不断追求完美的过程中,不断的引入新的知识点--进程和线程的出现就足可以说明这一切)

优点:使多个程序并发执行 缺点:程序并发执行时付出了巨大的时空开销,每个进程在进行切换时身上带了过多的“累赘”导致系统效率降低。 于是人们为了解决这个缺点想到让进程在并行时不拥有资源---从而引入了线程的概念:即线程本身不拥有资源或者是很少的资源,进程只是拥有资源的基本单位,线程是调度的基本单位 7.线程的引入: 在操作系统中引入线程则是为了减少程序并发执行时所付出的时空开销,使操作系统具有更好的并发性。 二.Linux中是如何具体实现进程和线程 1.在linux中通过task_struct结构体来描述进程的PCB,我们可以在include/linux/sched.h中看到对进程task_struct的定义和进程状态的描述。 1>linux中的进程状态 a.运行状态:进程正在运行或在运行队列中等待运行 。

b.可中断等待状态:进程正在等待某个事件完成(如等待数据到达)。等待过程中可以被信号或定时器唤醒。 c.不可中断等待状态:进程正在等待某个事件完成并且等待中不可以被信号或定时器唤醒,必须一直等待到事件发生。

d.僵死状态:进程已终止,但进程描述符依然存在,直到父进程调用wait()函数后释放。 e.停止状态:进程因为收到SINSTOP,SIGSTP,SIGTIN,SGIOU信号后停止运行或者该进程正在被跟踪。

Tiger-john说明:

1在include/linux/sched.h 中我们可以看到Linxu中进程状态的具体实现: #defineTASK_RUNNING 0

#defineTASK_INTERRUPTIBLE 1

#defineTASK_UNINTERRUPTIBLE 2

#defineTASK_ZOMBIE 4

#defineTASK_STOPPED 8

其中:

TASK_RUNNING是就绪态,进程当前只等待CPU资源。

TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE都是阻塞态,进程当前正在等待除CPU外的其他系统资源;前者可以被信号唤醒,后者不可以。

TASK_ZOMBIE是僵尸态,进程已经结束运行,但是进程控制块尚未注销。

TASK_STOPPED是挂起状态,主要用于调试目的。进程接收到SIGSTOP信号后会进入该状态,在接收到SIGCONT后又会恢复运行。

2.我们可以在终端中通过命令ps或pstree查看当前系统中的进程 用ps命令可以查看进程的当前状态。运行状态为R,可中断等待状态为S,不可中断等待状态为D,僵死状态为Z,停止状态为T。

实例:

think@ubuntu:~$ ps -eo pid,stat PID STAT 1 Ss 2 S 3 S 37 SN 364 Ss 371 S<

442 S

1081 Ssl 1085 Ssl 1203 Ss+

3782 Ss

3803 R+

Tiger-John说明:

在运行结果中有一些后缀字符,其意义分别为

例如:Ssl说明该进程处于可中断等待状态,且该进程为会话首进程,而且是一个多线程的进程。

2.linux系统的进程间通信有哪几种方式 1>管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用 。进程的亲缘关系通常是指父子进程关系。

2>有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信 。

3>信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 4>消息队列( message queue ) :消息队列是消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

5> 信号 ( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

6> 共享内存( shared memory ):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

7>套接字( socket ) :套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。 3.进程控制 1>linux进程控制包括创建进程,执行进程,退出进程以及改变进程优先级等。 在linux系统中,用于对进程进行控制的系统调用有: a.fork:用于创建一个新进程。 b.exit :用于终止进程 c.exec :用于执行一个应用程序 d.wait :将父进程挂起,等待子进程终止 e.getpid :获取当前进程的进程ID f.nice : 该变进程的优先级 4.进程标识 1>Linux操作系统中,每个进程都是通过唯一的进程ID标识的。进程ID是一个非负数。每个进程除了进程ID外还有一些其它信息,都可以通过相应的函数获得。

2>主要的函数有:

pid_tgetpid(void) :获得进程ID

pid_t getppid(void):获得进程父进程的ID

pid_tgetuid(void) :获得进程的实际用户ID

pid_t geteuid(void) :获得进程的有效用户ID

pid_t getgid(void) : 获得进程的实际组ID

pid_t getegid(void) 获得进程的有效组ID

Tiger-Johen说明: 这些函数的声明在sys/types.h和unistd.h 头文件中。 2>用户ID和组ID的相关概念 a.实际用户ID(uid) :标识运行该进程的用户

b.有效用户ID( euid): 标识以什么用户身份来运行进程。

例如:一个普通用户A,运行了一个程序,而这个程序是以root 身份来运行的,着程序运行时就具有root权限。此时,实际用户ID时A用户的ID,而有效用户ID是root用户ID

3>函数实例: 表头文件:#include

#include

函数定义:pid_t getpid(void)

函数说明:getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题

返回值:目前进程的进程识别码

函数实例:

#include

#include #include

main()

{

printf("pid = %d/n", getpid());

}

三.进程的内存映像 1.Linux下程序转化成进程 a.Linux下C程序的生成分为4个阶段:

预编译

编译

汇编

链接

Tiger-Johen说明:

编译器gcc进过预编译,编译,汇编3个步骤将源程序文件转换为目标文件。

b.当程序执行时,操作系统将可执行程序复制到内存中。程序转化为进程通常需要经过以下步骤:

内核将程序读入内存,为程序分配内存空间

内核为该进程分配进程标识符(PID)和其他资源

内核为该进程保存PID及相应的状态信息,把进程放到运行队列中等待执行。程序转化为进程后就可以被操作系统的调度程序执行了。

2.进程的内存映像 a.进程的内存映像是指内核在内存中如何存放可执行程序文件 。在将程序转化为进程的过程中,操作系统将可执行程序由硬盘复制到内存中。

b.linux下程序映像的一般布局如下:(从低地址到高地址)

1>代码段:代码段是只读的,可被多个进程共享。

2>数据段: 存储已被初始化的变量,包括全局变量和已被初始化的静态变量。

3>未初始化数据段:存储未被初始化的静态变量,它也被称为bss段

4>堆:用于存放程序运行中动态分配的变量

5>栈:用户函数调用,保存函数的返回地址,函数的参数,函数内部定义的局部变量。

Tiger-Johen说明:

可执行程序和内存映像的区别 :

a.可执行程序位于磁盘中而内存映像位于内存中;

b.可执行程序没有堆栈,因为程序 被加载到内存中才会分配堆栈;

c.可执行程序虽然也有未初始化数据段但它并不被储存在位于硬盘中的可执行文件中;

d.可执行程序时静态的,不变的,而内存映像随着程序的执行时在动态变化的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++基础11-类和对象之操作符重载2

总结&#xff1a; 1、等号操作符重载和拷贝构造函数重载一般用在数据成员中需要单独在堆区开辟内存时(指针) 2、new&#xff0c;delete重载内部还是使用malloc和free 3、逗号表达式(,)、或者(||)&#xff0c;且(&&)&#xff0c;条件表达式(?:)具有短路功能。 但…

linux照片备份软件,Linux、Unix上5个惊艳开源备份软件

Linux和类Unix系统上5个惊艳的开源备份软件&#xff1a;Bacula、Amanda、Backupninja、Backuppc和UrBackup&#xff0c;这些都是既可以使用在Linux上也可以使用在Unix上面&#xff0c;他们的优点就是性能稳定&#xff0c;使用灵活。一个好的备份计划是非常必要的&#xff0c;这…

C/C++混淆点-运算符短路

主要内容如下&#xff1a; 按照C/C标准 1.9.18 节的说明&#xff0c;||,&&,?:三目运算符和逗号运算符采用短路运算&#xff0c;第一个表达式之后作为一个运算顺序点。 1 a && b; 2 a || b; 3 a ? b : c; 4 a, b; 短路运算仅对内置的行为有效&#xff0c;如…

C++基础12-类和对象之操作符重载-string练习

总结&#xff1a; 1、等号操作符重载注意事项&#xff1a; &#xff08;1&#xff09;防止自身赋值 &#xff08;2&#xff09;先将自身的额外开辟的空间回收掉 &#xff08;3&#xff09;执行深拷贝 2、注意函数的返回引用或者元素&#xff1a;如果需要连续使用 …

linux中类似findfirst的函数,findfirst函数的用法

函数名称: findfirst函数原型: int findfirst(char *fname,struct ffblk *ptr,int attrib)函数功能: 寻找与fname相匹配的第一个文件名称函数返回:参数说明: ptr-保存查找到的文件信息所属文件: #include #include int main(){struct ffblk ffblk;int d…

C/C++混淆点-逗号运算符

在C中&#xff0c;逗号是很常用的。作为一个运算符它虽然不常用&#xff0c;但我们也应该学会它的用法。 1.如&#xff1a;a3*4,4*5,5*6; 由于“”的优先级高于“&#xff0c;”&#xff0c;所以程序从左向右运行&#xff0c;即先运行a3*4。之后的4*5&#xff0c;5*6仅仅运行&a…

linux 添加重定向域名,Linux系统中Nginx的安装并进行域名认证和重定向

Linux系统中Nginx的安装并进行域名认证和重定向本文主要介绍Linux系统中Nginx的安装并进行域名认证和重定向&#xff0c;希望通过本知识点的讲解对大家今后的学习和工作有所帮助&#xff0c;下面进行具体介绍&#xff1a;12.6 Nginx安装cd /usr/local/srcwget http://nginx.org…

C/C++混淆点-转义字符

从表中可以看出&#xff0c;在C语言中有三种转义字符&#xff0c;它们是&#xff1a;一般转义字符、八进制转义字符和十六进制转义字符。 所有的转义字符只代表一个字符 1. 一般转义字符 这种转义字符&#xff0c;虽然在形式上由两个字符组成&#xff0c;但只代表一个字符。…

linux如何安装python环境变量中,Windows和linux环境下python安装及环境变量的配置

安装包的安装无需双版本存在情况下安装1)下载源码包2)解压源码包并进入文件夹./configure ; make && make install3)使用python -V查看是否安装成功&#xff0c;安装成功会显示python版本信息需要双版本安装python版本1)同上&#xff0c;需要下载3.6源码包2)解压源码包…

C/C++混淆点-strcat和strcpy区别

一、原因分析 假设&#xff1a; char * strNULL; strnew char[11];你想为字符串str开辟一个存储十个字符的内存空间&#xff0c;然后你现在有两个字符串&#xff1a;char * c1"abc"和char * c2"123";你想将这两个字符串都拼接在str字符串中&#xff0c;你…

linux有读EC RAM的工具吗,Step to UEFI (179)Shell下 EC Ram 读取工具

最近工作需要在 UEFI Shell 下Check EC Ram 的设定&#xff0c;发现手上只有 Windows 下的读取工具(RW Everything)。于是研究了一下如何在Shell 读取 EC Ram。根据【参考1】读取的流程如下&#xff1a;Port 66 CommandsThere are also some EC commands that use ports 0x66 …

C++基础13-类和对象之继承1

在 C中可重用性(software reusability)是通过继承(inheritance)这一机制来实现的。 如果没有掌握继承性,就没有掌握类与对象的精华。 总结&#xff1a; 1、只要是父类中的private成员&#xff0c;不管是什么继承方式&#xff0c;儿子都访问不了&#xff0c;但它是存在在儿子之…

线程锁定CPU linux,linux 线程与CPU绑定

看到很多程序都是根据CPU个数来创建线程个数&#xff0c;当时很不理解他们之间的关系&#xff0c;请教了项目组的同事后才有了大致了解。1. 相关系统函数下面的函数可以通过man命令查询到。SYNOPSIS#define _GNU_SOURCE#include int pthread_setaffinity_np(pthread_t thread, …

C++基础13-类和对象之继承2

总结&#xff1a; 1、子类对象可以当做父类对象使用 2、子类对象可以直接赋值给父类对象 3、子类对象能够直接初始化父类对象 4、父类指针可以直接指向子类对象 5、凡是继承过来的属性和函数都可以在子类中用this-> 进行访问 6、默认构造函数并不会初始化数据成员 7、如果…

linux内核 块驱动程序,linux – 为什么内核使用默认的块驱动程序而不是我的驱动程序代码?...

我写了一个块驱动程序,它创建了一个虚拟块设备(sbd0).我为该块设备注册了所有设备操作:(请参阅2.6.32内核源代码中的include /linux / blkdev.h)static struct block_device_operations sbd_ops {.owner THIS_MODULE,.open sbd_open,.release sbd_close,.ioctl sbd_ioctl,…

C++基础14-类和对象之多继承与虚继承

多继承&#xff1a;一个类有多个直接基类的继承关系称为多继承 总结&#xff1a; 1、一般将具有菱形样式继承方式的某些类声明为虚继承 3、虚继承的主要目的是为了防止二义性 2、虚继承就是在继承方式前加virtual 如果一个派生类从多个基类派生&#xff0c;而这些基类又有一…

linux系统安装ntp,CentOS下NTP安装配置

安装yum install ntp配置文件 /etc/ntp.confrestrict default kod nomodifynotrap nopeer noqueryrestrict -6 default kod nomodify notrap nopeer noqueryrestrict 127.0.0.1restrict -6 ::1# 用restrict控管权限# nomodify - 用户端不能更改ntp服务器的时间参数# noquery - …

C++基础15-类和对象之多态

总结&#xff1a; 1、在父类中申明虚函数时&#xff0c;一般情况下在子类中也申明&#xff08;便于读代码&#xff09; 一、赋值兼容 赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。 赋值兼容是一种默认行为,不需要任何的显示的转化步骤。 …

傲云浏览器linux,Centos7安装部署zabbix监控软件

目录部署监控服务器部署监控服务器Zabbix ServerWeb页面验证设置部署监控服务器一、安装LNMP环境Zabbix监控管理控制台需要通过Web页面展示出来&#xff0c;并且还需要使用MySQL来存储数据&#xff0c;因此需要先为Zabbix准备基础LNMP环境。1. wget下载官网Nginxwget http://ng…

C++基础16-类和对象之联编,重写,虚析构

1、静态联编和动态联编 1、联编是指一个程序模块、代码之间互相关联的过程。 2、静态联编&#xff08;sta5c binding&#xff09;&#xff0c;是程序的匹配、连接在编译阶段实现&#xff0c;也称为早期匹配。重载函数使用静态联编。 3、动态联编是指程序联编推迟到运行时…