在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.可执行程序时静态的,不变的,而内存映像随着程序的执行时在动态变化的
在Linux系统下实现进程,Linux进程学习(一)之Linux进程的基本知识和实现相关推荐
- Vi(Linux系统下的标准编辑器)学习笔记
前言 各种操作系统都有比较友好的界面,习惯于Windows,Linux,Mac的各种操作界面的情况下,使用命令行简直太难受了 然后,为了方便对学校的hustoj进行各种加题.配spj的操作,本校的学长 ...
- linux系统下复制粘贴不了怎么办,VirtualBox 导致 Linux 桌面环境下无法复制粘贴
两台 Optiplex 9020 工作站中的一台,跑的是 Linux 3.11 + GNOME 3.4 + Compiz 桌面环境,因为是干活用的,只求稳定不出问题所以平时很少折腾,最近一次重启都是3 ...
- linux系统下 新建文件夹,使用ln命令在Linux系统中创建连接文件
导读 在Linux中ln命令用来为文件创建连接,连接类型分为硬连接(Hard Link)和符号连接(Symbolic Link)两种,默认的连接类型是硬连接.如果要创建符号连接必须使用"-s ...
- Linux系统下_拷贝下载windows文件_出现linux文件名乱码
问题描述: 1.下载下来压缩包解压之后,文件名出现乱码,文件内容是正常的 -rw-rw-r-- 1 kql kql 39085 12月 16 2019 10.·ÇÏßÐԻعé.ipynb -rw- ...
- linux系统下的ocr软件,【工具类】Linux安装OCR识别工具tesseract
1 安装依赖 yum install -y libpng-devel libjpeg-devel libtiff-devel 2 安装leptonica tar -xzvf leptonica-1.7 ...
- linux第三方模块参数,nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链步骤(linux系统下)...
nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链步骤(linux系统下),安装Nginx和HttpAccessKeyModule模块(参考LNMP环境 ...
- linux mplayer分析,Linux系统下玩转 MPlayer
Linux系统下玩转 MPlayer,MPlayer 是我在 Linux 系统中用到的相当好的媒体播放程序,它因支持播放广泛的音/视频文件格式而著称.本文所要探 MPlayer 是我在 Linux 系 ...
- Unix/Linux操作系统分析实验四 设备驱动: Linux系统下的字符设备驱动程序编程
Unix/Linux操作系统分析实验一 进程控制与进程互斥 Unix/Linux操作系统分析实验二 内存分配与回收:Linux系统下利用链表实现动态内存分配 Unix/Linux操作系统分析实验三 文 ...
- linux c 获取mac地址吗,Linux系统下用C语言获取MAC地址
最近在做一个小程序,需要用到在linux系统里编写C程序从而获取MAC地址,从网上搜了一遍,想总结一下.如果你就只需要单个功能的程序,可以采用方法一,见代码1,一般最好能够封装起来,写成获取MAC地址 ...
- linux系统上运行sh,Linux系统下如何运行.sh文件的实现
Linux系统下如何运行.sh文件的实现 在Linux系统下运行.sh文件有两种方法,比如我在root目录下有个datelog.sh文件 第一种(这种办法需要用chmod使得文件具备执行条件(x): ...
最新文章
- 绩效面谈流程,阿里是这样做的
- 核PCA——从理论到实现
- Ubuntu17.04 之 systemd 设置开机启动
- 2 django系列之django分页与templatetags
- python中cock什么意思_[转载]原创脚本逐步实现Autodcock-Vina的虚拟筛选及筛选后分析...
- 国嵌视频光盘及源码网盘下载地址-续
- 查看mysql数据插入时间_[译] MySQL 最佳实践 —— 高效插入数据
- Java设计模式学习总结(12)——结构型模式之外观模式
- ERROR 1045 (28000): Access denied for user 'backup'@'mysql' (using password: YES)
- msp430入门编程47
- 菲尔·席勒(Phil Schiller)卸任苹果全球营销高级副总裁,升任苹果研究员
- 一文了解间隙配合、过盈配合、过渡配合的特点、区别及适用范围
- 可伸缩系统的架构经验
- 网站seo诊断,网站seo诊断方法
- mysql典型安装和完全安装的区别_MySQL安装详解(安装版本mysql-5.5.25)
- android图片降低图片大小保持图片清晰的方法
- 联想计算机怎么添加打印机,电脑和联想打印机连接不上怎么办啊
- 【目标检测】目标检测中常见的评价指标
- 高斯数据库与mysql_高斯数据库 (gaussDB) - 创建和管理数据库
- 中国有句俗语叫“三天打鱼两天晒网”。 某人从2010年1月1日起开始“三天打鱼两天晒网”, 问这个人在以后的某一天中是“打鱼”还是“晒网”
热门文章
- messageformat.format() 自定义参数名_DedeCMS的Java版mcms 第四季之一: 自定义插件
- java同样作用的方法_Java的接口用途和方法
- php ini 长连接秒数,php使用webSocket实现Echarts长连接自动刷新的解决方案(2):后端服务端代码返回json数据...
- python怎么引入os模块的函数_Python里的OS模块常用函数说明
- linux下usb驱动配置文件,Linux环境下USB的原理、驱动和配置
- java 像素级碰撞检测,» 像素级碰撞检测类
- ROS底盘控制节点 源码分析
- java二维数组排序先行后列,数组知识点归纳
- 条件队列java_Java并发系列(4)AbstractQueuedSynchronizer源码分析之条件队列
- mysql加锁后怎么解除_Mysql查看死锁与解除死锁的深入讲解