Linux编程手册读书笔记第二章(20140330)

  1. 内核:管理和分配计算机资源(即CPURAM和设备)的核心软件层
  2. Linux内核可执行文件采用/bootvmlinuz或类似的路径名,“z”表明内核是经过压缩的可执行文件。
  3. 内核主要任务:

    1)进程调度:Linux属于抢占式多任务系统,多个进程(即运行中的程序)可同时驻留于内存,都能获得对CPU的使用权

    2)内存管理:以高效、公平地方式在进程之间共享这一资源,Linux采用了虚拟内存管理机制。

                           虚拟内存管理机制优势:

                           a. 进程与进程之间、进程与内核之间彼此隔离;一个进程无法读取或修改内核或掐他进程的内存内容

                           b. 只需将进程的一部分保持在内存中,降低了每个进程对内存的需求量,使得可以在内存中加载更多的进程。

    3)提供了文件系统:内核在磁盘上提供有文件系统,允许对文件执行创建、获取、更新、删除等操作

    4)创建和终止进程:内核可以将新进程载入内存,为其提供运行所需的资源(CPURAM以及对文件的访问)。

                                    一旦进程执行完毕,内核需要确保释放其占用的资源,以供或许进程使用

    5)对设备的访问:计算机外接设备(鼠标、键盘、磁盘等),可实现计算机与外部世界的通信。

                                 内核为进程提供了访问设备的标准接口,同时还仲裁多个进程对同一个设备的访问。

    6)联网:内核以用户进程的名义收发网络消息(数据包),同时将该数据包路由至目标系统。

    7)提供系统调用API:进程可以利用系统调用API,请求内核去执行各种任务。


  1. 用户态和核心态

      1CPU一般在这两种不同状态下运行,执行硬件指令可使CPU在两种状态来回切换

      2)虚拟内存区域划分为:用户空间部分、内核空间部分

      3)用户态下运行时,CPU只能访问被标记为用户空间的内存,试图访问内核空间的内存,将会引发硬件错误

      4)核心态下运行时,CPU既能访问用户空间的内存,又能访问内核空间的内存。

      5CPU在核心态下运行时,可以执行特殊操作。如宕机(halt)、访问内存管理硬件、设备I/O操作的初始化


  1. 交换区:磁盘空间中的保留区域,作为RAM的补充---进程可被保存至交换区
  2. 内核维护的底层数据结构,可将进程使用的文件名称转换为磁盘的物理位置
  3. 内核维护每个进程的虚拟内存与计算机物理内存及磁盘交换区之间的映射关系。
  4. 某进程可创建另一个进程---真正含义:某进程可以请求内核创建另一个进程。(因进程间所有通信都需要内核提供的通信机制完成)
  5. shell(命令解释器):用于读取用户输入的命令,并执行相应的程序以响应命令。

    1)登陆shell:用户刚登陆系统时,由系统创建,用以运行shell的进程。

    2)对于UNIX系统而言,shell只是一个用户进程。

    3)登陆同一台计算机的不同用户同时可以使用不同的shell(就单个用户来说,情况也一样)

    4shell设计两个目的:a. 人机交互; b. 解释shell脚本(包含shell命令的文本文件)

    5shell内置有许多通常与编程语言相关的功能:包括变量、循环、条件语句、I/O命令、函数等

    6)几种重要的shell

            a. Bourne shellsh):历史最为悠久,曾是UNIX第七版标配的shell,包含许多常见特性:I/O重定向、管道、文件名生成(通配符)、

               变量、环境变量处理、命令替换、后台命令执行、函数等。

            b. C shellcsh):曾经时BSD系统的标配,但与Bourne shell并不兼容,为了保证在UNIX系统的移植性,人们更倾向使用Bourne shell

            c. Korn shellksh):AT&T贝尔实验室编写,是Bourne shell的继任者,同时吸收了C shell的很多交互特性

            d. Bourne again shellbash:GNU项目对于Bourne shell的重新实现,同时提供了与Korn shellC shell类似的交互特性。

               LinuxBourne shell正是由Bourne again shell仿真提供的

  1. 超级用户:用户ID0,通常登录名为root
  2. 用户密码文件/etcpasswd:包含用户名、用户IDUID)、组ID、主目录、登陆shell
  3. 用户组文件/etcgroup:组名、组IDGID)、用户列表(隶属于该组的用户登录名列表)
  4. 为了访问文件,用户分为3类:文件(属主)的用户;文件用户同一组的用户;其他用户
  5. Shell启动的进程会继承3个已打开的文件描述符:描述符0为标准输入;描述符1为标准输出;描述符2为标准错误。
  6. stdio函数库中,这几种描述符分别与文件流stdinstdoutstderr相对应
  7. C语言标准库的I/O函数(stdio函数库):fopenfclosescanfprintffgetsfputs     stdio函数位于I/O系统调用层(openclosereadwrite 等)之上。
  8. 过滤器:从stdin读取输入,加以转换,再将转换后的数据输出到stdout,常将拥有上述行为的程序称为过滤器,如catgreptrsortwcsedawk
  9. 逻辑上将一个进程划分为以下几个部分(也称为段)

    1)文本:程序的指令

    2)数据:程序使用的静态变量

    3)堆:程序可以从该区域动态分配额外内存

    4)栈:随函数调用、返回而增减的一片内存,用于为局部变量和函数调用链接信息分配存储空间。

19.子进程从父进程处继承数据段、栈段、堆段的副本后,可以修改这些内容,不影响父进程的原版内容。

  1. 有两种方式可以终止一个进程:其一,进程使用_exit()系统调用(或相关的exit()库函数),请求退出;其二,向进程传递信号,将其杀死
  2. 进程的终止状态,一个非负小整数,可供父进程的wait()系统调用检测。
  3. 终止状态为0表示进程功成身退,非0表示有错误发生。
  4. 大多数shell会将前一执行程序的终止状态保存于shell变量$?中。
  5. init进程:系统引导时,内核创建,是所有进程之父,该进程相应的程序文件为sbininit”init的进程号为1,总以超级用户权限运行。谁(哪怕是超级用户)都不能杀死”init进程,只有关闭系统才能终止该进程。init的主要任务是创建并监控系统运行所需的一系列进程。
  6. 进程间通信(IPC)机制:

    1)信号(signal),用来表示事件的发生

    2)管道(亦即shell用户所熟悉的操作符)和FIFO,用于在进程间传递数据

    3)套接字,供同一台主机或是联网的不同主机上所运行的进程之间传递数据。

    4)文件锁定,为防止其他进程读取或更新文件内容,允许某进程对文件的部分区域加以锁定

    5)消息队列:用于在进程间交换消息

    6)信号量(semaphore):用来同步进程动作

    7)共享内存:允许两个及两个以上进程共享一块内存。当某进程改变了共享内存的内容时,其他所有进程会立即了解到这一变化。

26.内核、其他进程(只要有相应的权限)或进程自身均可向进程发送信号。

  1. 发生下列情况之一时,内核可以向进程发送信号:

    1)用户键入中断字符(通常为CtrlC

    2)进程的子进程之一已经终止

    3)由进程设定的定时器(告警时钟)已经到期。

    4)进程尝试访问无效的内存地址。

28.shell中,可使用kill命令向进程发送信号;在程序内部,系统调用kill()可提供相同的功能。

  1. 收到信号时,进程会根据信号采取如下动作之一:忽略信号;      被信号“”杀死;     先挂起,之后再被专用信号唤醒。
  2. 多个线程之间,共享同一数据区域和堆,每个线程拥有属于自己的栈。线程之间可以通过共享的全局变量进行通信。
  3. shell执行的每个程序都会在一个新进程内发起。比如,shell创建了3个进程来执行以下管道命令(在当前的工作目录下,根据文件大小对文件进行排序并显示):ls -l | sort -k5n | less
  4. 伪终端:是一对相互连接的虚拟设备,也称为主从设备。在这对设备之间,设有一条IPC信道,可供数据进行双向传递。telnetssh都属于伪终端。

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

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

相关文章

直接交换排序

直接交换排序 缺点:进行一些重复性比较,解决放法:堆排序 选择排序优化 //如果当前的数大于假定最大的数 //改变下标 //如果当前的数小于假定最小的数 //改变下标 //遍历数组跳到下一个元素 //如果最大的数没有在它的位置上 //交换 //交换…

Linux编程手册读书笔记第三章(20140407)

外壳函数执行一条中断机器指令(int 0x80),引发处理器从用户态切换到核心态,并执行系统中断0x80的中断矢量所指向的代码。(在2.6内核及glib 2.3.2之后的版本都支持sysenter指令,进入内核的速度更快&#xff…

Linux编程手册读书笔记第四章(20140407)

标准文件描述符定义在<unistd.h>中&#xff0c;STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO打开一个文件&#xff1a;open&#xff08;&#xff09; &#xff03;include<sys/stat.h> #include<fcntl.h> int open(const char *pathname, int flags, …/* …

快速排序概念及实现

快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c; 其基本思想为&#xff1a; 任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列…

Linux编程手册读书笔记第五章(20140408)

改变已打开文件性质&#xff1a;fcntl&#xff08;&#xff09; #include<fcntl.h> int fcntl(int fd, int cmd, …); (1) 调用失败返回&#xff0d;1 &#xff08;2&#xff09;fcntl函数有5种功能&#xff1a; a. 复制一个现有的描述符&#xff08;cmd&#xff1d;F_D…

归并排序概念及其实现

基本思想&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个…

##连接符和#符的使用

C语言中如何使用宏C&#xff08;和C&#xff09;中的宏&#xff08;Macro&#xff09;属于编译器预处理的范畴&#xff0c;属于编译期概念&#xff08;而非运行期概念&#xff09;。下面对常遇到的宏的使用问题做了简单总结。 关于#和## 在C语言的宏中&#xff0c;#的功能是将其…

计数排序和基数排序

适用于数据集中在某个范围中&#xff0c; //统计每个数据出现的次数 计数排序&#xff1a;鸽巢原理 1找范围 2给空间 3记次数 4回收 for(int i 0;i<size; i) {temp[array[i]]; }for(int i0;i<range;i&#xff09;{while(temp[i])array[index]i;}代码实现 时间复杂度&…

信号量sem_wait()的使用

闲来无事&#xff0c;我给大家讲下UNIX/Linux下信号量函数的使用。首先你得知道什么叫信号量&#xff0c;什么时候要用信号量。这个嘛&#xff0c;主要就是用来保护共享资源的&#xff0c;也就是说如果你想限制某个&#xff08;些&#xff09;资源在同一时刻只能有一&#xff0…

C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))

1. C关键字(C98) 2. 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用 域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名冲突或名字污…

va_list和vsnprintf、getopt

原理解释&#xff1a; VA_LIST 是在C语言中解决变参问题的一组宏&#xff0c;在<stdarg.h>头文件下。 VA_LIST的用法&#xff1a; &#xff08;1&#xff09;首先在函数里定义一具VA_LIST型的变量&#xff0c;这个变量是指向参数的指针 &#xff08;2&a…

GitHub相关

git是一个版本控制工具. 主要解决三个问题 代码被喵星人吃掉了.产品经理反复修改需求, 需要同时维护多个版本代码.多人协同开发. 安装 git for windows 这个是一个git的windows系统的命令行版本 https://git-scm.com/downloads 下载会很慢很慢 使用 Github 创建项目 注册…

linux中bin与sbin目录的作用及区别介绍

在linux系统中&#xff0c;有两个重要的目录&#xff1a;bin与sbin&#xff0c;分别包括/bin、/usr/bin/与/sbin、/usr/sbin/。 bin: bin为binary的简写&#xff0c;主要放置系统的必备执行文件&#xff0c;例如: cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、m…

c++起始(名词修饰,extern “C” ,引用)

名字修饰(name Mangling) 在C/C中&#xff0c;一个程序要运行起来&#xff0c;需要经历以下几个阶段&#xff1a;预处理、编译、汇编、链接。 Name Mangling是一种在编译过程中&#xff0c;将函数、变量的名称重新改编的机制&#xff0c;简单来说就是编译器为了区分各 个函数…

Linux进程间通信方式--本地socket

先上一个代码 服务端&#xff1a; [cpp] view plaincopy //s_unix.c #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #define UNIX_DOMAIN "/tmp/UNIX.domain" int main(void) { so…

extern和static的区别

c语言中的 static&#xff1a; 修饰局部变量&#xff1a;存放在静态数据区&#xff0c;生命周期位整个程序结束&#xff0c;但作用于仍为函数局部。 修饰全局变量&#xff1a;无法被同一工程其他源文件访问。 修饰函数&#xff1a;与全局变量类似。 extern&#xff1a; 可被…

RT5350原厂SDK及AP移植步骤详解

最近想搞一下rt5350&#xff0c;所以找了个原厂的SDK包进行了编译&#xff0c;很快路由器就可以用了&#xff0c;把我的编译操作步骤写了下分享给更多的爱好者&#xff0c;供大家参靠&#xff0c;下一步准备移植摄像头玩玩。有兴趣的可以一起交流。 RT5350移植Toolchain工具的安…

linux系统编程之进程概念(操作系统---管理,进程创建,进程状态,进程优先级, 环境变量,程序地址空间,进程O(1)调度方法)

系统编程&#xff1a; 进程概念->进程控制->基础IO->进程间通信->进程信号->多线程进程概念 冯诺依曼体系结构----现代计算机硬件体系结构 冯诺依曼体系结构----现代计算机硬件体系结构 计算机五大硬件单元&#xff1a;输入设备&#xff1a;键盘输出设备&#…

Make Menuconfig详解 (配置内核选择)

Make Menuconfig简介 make menuconfig 图形化的内核配置make mrproper -----删除不必要的文件和目录. #make config&#xff08;基于文本的最为传统的配置界面&#xff0c;不推荐使用&#xff09; #make menuconfig&#xff08;基于文本选单的配置界面&#xff0c;字符终端下…

Linux系统编程之进程控制(进程创建,fork函数,进程中止,进程等待,程序替换)

进程创建 fork()------复制&#xff0c;返回值&#xff0c;写时复制 vfork()创建子进程—子进程与父进程共用同一块虚拟地址空间&#xff0c; 为了防止调用栈混乱&#xff0c;因此阻塞父进程直到子进程调用exit&#xff08;&#xff09;退出或者进行程序替换 vfork创建的子…