系统编程基础知识

一、系统概述

1、什么是操作系统

操作系统就是把计算机硬件管理起来,让硬件和整个系统正常运行

2、计算机的主要组成

CPU 内存(主存) 硬盘(光盘,移动硬盘和U盘) 鼠标和键盘 显示器

3、计算机程序的运行过程

从内存中取一条指令

通过控制器译码

从内存中把数据取到CPU

CPU逻辑和数据运算

把计算的结果返回到内存

取址 译码 运算

4、CPU的组成

运算器 控制器 寄存器组

寄存器组分2种,通用寄存器组和专有寄存器组,用户的可见的是通用寄存器组

外设中也有寄存器,

寄存器分类:

控制寄存器

数据寄存器

状态寄存器

5、计算机总线

地址总线:计算机可以寻址的内存空间,32位系统2^32=4G 64位系统2^64=2^32*2^32=4G*2^32

数据总线:计算机同时发送数据的位数,并发发送的位数,比如有24位

控制总线:发送控制信号

中断信号 时钟 复位 IO读写 存储器读写 总线请求允许

6、计算机指令的格式

http://192.168.109.151/LinuxNetwork.tar.gz

http://192.168.109.151/sysnetbooks.tar.gz

操作码和地址码

4地址指令

OP A1 A2 A3 A4

3地址指令

OP A1 A2 A3 下一条指令隐含在程序计数器PC

2地址指令

OP A1 A2

1地址指令

OP A1 另一个数据在ACC累加器

0地址指令

OP 数据隐含在堆栈指针SP中

7、程序指令取值的方式

1)立即数寻址

add r0,r1,#2

2)直接寻址

3)隐含寻址

4)间接寻址

5)寄存器寻址

6)寄存器间接寻址

7)基址寻址

8)变址寻址

9)相对PC寻址

10)堆栈寻址 SP

8、控制器

MAR 内存地址寄存器

NBR 内存缓冲寄存器

IO AR IO地址寄存器

IO BR IO地址缓冲寄存器

PC  程序计数器

PSW 程序状态寄存器

 

CPU主要是通过控制器和内存进行数据的传输,为了避免CPU和内存速度不匹配,引入了cache

 

9、冯.诺伊曼架构

1)二进制思想

2)程序顺序存储

计算机中的一切信息=二进制+上下文

 

10、计算机的发展过程

1、单通道计算机系统

2、多通道计算机系统

3、分时系统

时间片(time slice)

1)如何保证多个任务正确的同时运行

2)如何多个任务同时读写一个文件

3)如何实现任务的并发和竟态

4)如何为上层应用程序提供统一的接口

在分时系统的基础上,如果实现了上面的4个问题,那么就成为了现在的操作系统

4、现在操作系统

多用户、多任务的

通用的操作系统

Windows

Linux

Unix

MAC OS

嵌入式操作系统

IOS

android

移植裁剪过的Linux系统

VxWorks

UCOSII

嵌入式操作系统要求有更高的实时性,响应速度更快,通过抢占式中断(进程的优先级)的方式

11、现在操作系统的组成

现在操作系统分6部分?

任务管理:任务在操作系统体现为进程或者线程

内存管理:MMU 我们程序中使用的内存是逻辑内存地址,逻辑内存地址映射到物理内存地址的;逻辑地址连续的内存,物理地址不一定连续;链表不一定是连续的内存空间,但数组是连续的内存空间

网络管理:ifconfig ping route netstat

文件管理:ext4 fat32 ntfs yaffs2(android)

设备管理:计算机的核心硬件和各种外设硬件

系统(启动)管理:shutdown init reboot halt

12、系统调用

操作系统分为应用层和内核层

应用程序发送数据给操作系统的内核,发送数据的过程是通过系统调用。换句话说,应用程序通过系统调用发送数据给内核,内核把发送过来的数据进行逻辑运算,然后把计算的结果通过系统调用返回给应用程序

系统调用类似于 客户端-服务器架构

13、系统调用和glibc库的区别

glibc是封装的系统调用函数,但是只是封装了大部分系统调用,并不是所有的。

为什么封装成glibc代码库,是因为封装以后,函数更方便使用和移植,可读性更好

举例子:

fopen() fclose() fread() fwrite() fseek()是glibc库函数

open() close() read() write() lseek()是系统调用函数

exit()函数是glibc库函数

_exit()函数是系统调用函数

 

int exit(int num)//glibc函数

{

_exit(num);//系统调用函数

printf("\n");

}

14、C程序的内存布局

代码区:存放程序源代码的内存空间

数据区:普通变量(函数局部变量,函数参数) static const 全局变量

栈区:函数局部变量,函数参数

堆区:malloc() free()

堆栈是一块连续的内存空间,栈空间从高地址向低地址增加,堆空间从低地址向高地址增加

15、硬盘

盘面,扇区,磁头

磁盘在旋转的同时,磁头按照扇区寻找数据的

扇区:512字节

组:多个扇区组成组,1K 2K 4K

分区:多个组成为分区

16、阻塞 非阻塞 异步

阻塞:scanf() fgets() getchar()

非阻塞:中断原来的程序,更高优先级的程序先运行,原来的程序在循环查询中断向量表,等中断的返回

异步:DMA(直接的内存访问)是异步。刚开始的时候cpu通知磁盘控制器拷贝数据,然后磁盘控制器开始拷贝数据,拷贝完了以后,磁盘控制器通知cpu。

异步,只关注开始和结束,中间数据运行过程各自忙各自的。

二、标准文件IO

1、按照字符读写

getchar() putchar()

2、按照行读写

fgets() fputs()

3、按照块读写

fread() fwrite()

4、循环读写文件

while(fread()>0)

{

......

}

5、文件拷贝的例子

diff命令比较2个文件是否相同

6、把ini文件转化为html文件

1)ini文件

 

;stu

[stu]

wangwu = 123456

lisi = 123456

;teac

[teac]

zhangsan = 123456

 

2)html xml文件

 

<!__stu__>

<stu>

wangwu=123456

lisi=123456

</stu>

<!__teac__>

<teac>

zhangsan=123456

</teac>

7、系统默认支持的最大文件描述符

stdin  标准输入

stdout 标准输出

stderr 标准错误输出

最大文件描述符的个数

默认情况下是1024个

系统能够支持的最大文件描述符的个数是

cat /proc/sys/fs/file_max

三、系统文件IO

1、文件类型

ls -l

- 普通文件

d 目录文件

c 字符设备文件

b 块设备文件

s socket文件

p 管道文件

l link链接文件

2、链接文件

1)软链接:ln -s oldfile newfile

软链接相当于是快捷方式,软链接和源文件是2个不同的inode索引值 修改都修改

2)硬链接:ln oldfile newfile

硬链接不但但是源文件的拷贝,而且源文件和硬链接文件有一个修改,则另一个相应修改,修改都修改的过程,只有把源文件和硬链接文件都删除,才算把硬链接文件删除;源文件和硬链接文件使用的是同一个inode索引编号,所以说源文件和链接文件是同一个文件的不同表现形式

3)使用ls -li查看链接文件的inode索引编号

3、文件描述符

2种文件描述符:标准文件描述符和系统文件描述符

标准文件描述符是FILE *fp;

系统文件描述符是int fd;

 

stdin  0 STDIN_FILENO

stdout 1 STDOUT_FILENO

stderr 2 STDERR_FILENO

4、系统文件IO函数

1)open()

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int open(const char *pathname, int flags, mode_t mode);

返回值:正确返回值是新生成的文件描述符,错误返回-1,并设置errno错误编码

pathname:文件名,可以是相对路径也可以是绝对路径

flags:

O_RDONLY:可读

O_WRONLY:可写

O_RDWR:可读写

O_CREAT:如果文件不存在则创建

O_TRUNC:每次写文件的时候都是重新写

O_APPEND:追加

mode:

111 111 111  777

110 100 100  644

写的时候一般写为0644,第一个0是粘着位

rw-r--r--(0644)

也就是说:

用户:可读可写

用户组: 可读

其他:可读

2)close()

#include <unistd.h>

int close(int fd)

返回值:成功返回0,错误返回-1,并设置错误码errno

3)read()

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

4)write()

#include <unistd.h>

sszie_t write(int fd, void *buf, size_t count);

5)lseek()

#include <sys/types.h>

#include <unistd.h>

off_t   lseek(int  fd,  off_t  offset,  int whence);

lseek对socket,管道文件描述符无效

5、errno错误编码

#include <errno.h>

char *str=strerror(errno);

perror("open");

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值