- 博客(34)
- 收藏
- 关注
转载 基于堆栈的计算器实现算法
对于计算器,有很多成熟的理论。本文章讨论的是利用一个操作数堆栈和一个运算符堆栈进行运算的方法。这种算法已经有很完善的解决方案,此处讨论的是最简化的模型,旨在让初学者在最短的时间内学到此算法的精髓,并能灵活的应用到科研的任何一个领域。简单表达式的计算 首先请看这个表达式: 3+5+6*7*8^2^3 (8^2指的是82) 这里运算有三种优先级“^”-->
2013-12-31 15:22:34 2443
转载 C# 下 FtpWebRequest 类的一个小问题
近日用到了FtpWebRequest这个类,用于连接到FTP服务器来下载文件,但是在使用下面代码的时候遇到了一些问题: private FtpWebRequest GetRequest(string url, bool useBinary) { FtpWebRequest ftpRequest = (FtpWebRequest)WebRe
2013-12-19 14:40:25 2252
原创 一种基于重载的高效c#上图片添加文字图形图片的方法
在做图片监控显示的时候,需要在图片上添加文字,如果用graphics类绘制图片上的字体,实现图像上添加自定义标记,这种方法经验证是可行的,并且在visual c#2005 编程技巧大全上有提到,但是,这种方法处理图片的速度超级慢。一面介绍一种一种基于重载的高效c#上图片添加文字图形图片的方法。using System;using System.Collections;using S
2013-12-12 10:22:31 1390
原创 获取FTP服务器目录的方法
private string[] GetFileList(string path, string ftpUserID, string ftpPassword, string WRMethods)//上面的代码示例了如何从ftp服务器上获得文件列表 { string[] downloadFiles; StringBuilder resu
2013-12-12 10:08:37 4074 1
原创 FTP下载功能C#
private bool Download(string[] dir, string fileName, string path, string ftpUserID, string ftpPassword)//下面的代码实现了从ftp服务器下载文件的功能,dir中分别为文件基础路径和下载保存文件名 { try { string filePath = this.basePath + @"\" + d
2013-12-12 09:57:10 749
原创 linux系统启动过程
第一阶段:BIOS启动过程1、对计算机硬件进行一系列的测试,通常称为加电自检。2、初始化硬件设备,这对现代基于pci的体系结构是相当重要的,它可以保证所有的硬件设备不会引起IRQ线和I/O端口冲突。3、搜索一个操作系统启动。实际上,根据BIOS的设置,这个过程可能要试图访问系统中的引导扇区。4、只要找到一个有效的设备,就把第一扇区的内容拷贝到RAM中从物理地址0x00007c00开
2013-10-06 14:16:38 728
原创 linux内核——进程地址空间
内核的函数以相当直接了当的方式直接获得动态内存,这是因为:1、内核是操作系统中优先级最高的成分,如果某个内核函数请求动态内存,那么,必定有正当的理由发出那个请求,因此没有道理推迟这个请求。2、内核信任自己。所有的内核函数假定是没有错的。当给用户态进程分配内存时情况完全不一样:1、进程对动态内存的请求被认为不是紧迫的,例如,当进程的可执行文件被装入时,进程并不一定立即对又有的代码页进
2013-10-06 10:19:17 1011
原创 linux内核-内存管理
intel的pentium处理器采用的是两种不同大小的页框:4KB和4MB,linux采用4kB页框大小作为标准内存分配单元。主要是因为:1、由分页单元引起的缺页异常很容易得到解释,或者是由于请求的页存在单不允许进程对其访问,或者是由于请求的页不存在,在第二种情况下,内存分配器必须找到一个4KB的空闲页框,并将其分配给进程。2、虽然4KB和4MB都是磁盘快的大小的倍数,但是在绝大多数情况下
2013-10-05 17:02:32 820
原创 linux内核软中断及tasklet
在内核执行的几个任务之间有些是不紧急的:在必要情况下他们可以延迟一段时间。一个中断服务程序的几个中断服务例程之间是串行执行的,并且通常在一个中断处理程序结束前,不应该再出现这个中断。相反,可延迟中断可以在开中断的情况下执行。把可延迟的中断从中断处理程序中抽取出来,有助于使内核保持较短的响应时间。软中断和tasklet有密切关系,tasklet是在软中断之上实现。事实上,出现在内核代码中的术语软
2013-10-04 23:16:00 989
原创 linux内核——进程通信
unix系统提供的进程通信的基本机制:管道和FIFO:最适合在进程之间实现生产者和消费者的交互。有些进程想管道中写数据,而另外一些进程从管道中读数据。信号量:资源控制的一种方式消息:允许进程在预定义消息队列中读和写来交换消息。Linux内核提供两种不同的消息版本System V IPC 消息和POSIX消息一节。共享内存区:允许进程通过共享内存来交换信息,在必须共享大量数据的时候,
2013-10-03 23:44:06 1217
原创 linux内核-信号
信号是很短的消息,可以被发送到一个进程或一组进程组。发送给进程的唯一信息通常是一个数,一次来标识信号。使用信号的两个主要目的是:让进程知道已经发生了一个特定的事件;强迫进程执行他自己代码中的信号处理程序。信号的一个重要特点是他们可以随时发送给状态经常不可预知的进程。发送给非运行进程的信号必须由内核保存,直到进程恢复执行。阻塞一个信号要求信号的传递拖延,知道随后解除阻塞,这使得信号产生一
2013-10-02 23:04:16 659
原创 linux内核-进程调度
调度策略linux调度基于分时技术:多个进程“时间多路复用”方式运行,因为cpu的时间被分成片,每个可运行进程分配一片。单处理机在任何时刻只能运行一个进程。如果当前运行的时间片到期,进程还没运行完毕,进程切换就发生。调度策略也是根据进程优先级对它们分类。有事复杂的算法求出进程当前的优先级,单最后的结果是相同的:每个进程都与一个值关联,这个值表示进程如何适当的分配给cpu。在Linux中,进
2013-10-02 19:53:05 968
原创 linux内核-内核同步
内核抢占:如果进程正执行内核函数时,即他在内核态运行,允许发生内核切换,那么这个内核是抢占的。无论是在抢占或者是非抢占内核中,运行在内核中的进程都可以放弃cpu,比如其原因是,进程由于等待资源而不得不转入睡眠状态。我们把这种进程切换叫做计划性进程切换。但是,抢占内核在响应引起进程切换的异步事件的方式上与非抢占内核是有差别的,我们将把这种进程叫做强制性进程切换。所有的进程切换都由宏switc
2013-09-30 14:45:23 720
原创 linux内核-中断和异常
中断通常定义为一个事件,该事件改变处理器执行的指令顺序。这个事件与cpu芯片内外部硬件电路产生的电信号相对应。同步中断:当前指令执行时的有cpu控制单元产生的,之所以成为同步,是因为只有在一条指令结束后才会发出中断。异步中断:由其他硬件设备依照cpu时钟信号随机产生的。同步中断和异步中断通常成为异常和中断,异常是有程序的错误产生的,或者是又内核必须处理的异常条件产生的。第一种情况下,内
2013-09-30 10:02:30 1237
原创 linux内核-进程
进程是多道程序设计系统的操作系统的基本概念,通常把进程定义为一个程序的执行实例。进程程序在一个数据实例上的一次执行过程,资源分配的基本单位轻量级进程在计算机操作系统中,轻量级进程(LWP)是一种实现多任务的方法。与普通进程相比,LWP与其他进程共享所有(或大部分)它的逻辑地址空间和系统资源;与线程相比,LWP有它自己的进程标识符,优先级,状态,以及栈和局部存储区,并和其他进程有着父
2013-09-29 16:20:21 828
原创 linux内核-内存寻址
内存地址程序员偶尔会引用内存地址作为访问内存单元的一种方式,但是,使用X86处理器时,我们必须区分以下三种不同的地址:逻辑地址:每一个逻辑地址都是由一个段和偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离。线性地址:也称虚拟地址,是一个32位无符号整数,可以用来表示4GB的地址,值范围从0x00000000到0xffffffff。物理地址:用于芯片级单元寻址。它们与微处理
2013-09-29 10:15:00 1064
原创 unix内核概述-内存管理
内存管理是最复杂的活动虚拟内存:所以新近的unix都提供一种有用的抽象叫虚拟内存。虚拟内存作为一种逻辑层,处于应用程序的内存请求与硬件内存管理单元之间,虚拟内存有很多用途和特点:若干个进程可以并发的执行;应用程序所需内存大于可用物理内存的时候也可以运行;程序只有部分代码装入内存是进程可以执行它;允许每个进程访问可用的物理内存子集;进程可以共享库函数或程序的一个单独镜像;
2013-09-28 21:03:58 1224
原创 unix内核概述-进程管理
fork()和_exit()系统调用分别用来创建一个新进程和终止一个进程,而调用exec类系统调用则是装入一个新程序。这样当一个系统调用执行玩以后,进程就在所装入程序的全新地址空间恢复执行。调用fork的进程是父进程,而新进程是他的子进程。父子进程能互相找到对方,因为每个进程的描述符都包含有两个指针,一个指向他的父进程,另一个指向他的子进程。实现fork的一个天真形式就是讲父进程的数据和代
2013-09-28 17:02:17 783
原创 unix内核概述-信号与进程间的通信
unix信号提供了一种把系统事件报告给进程的一种机制。每种事件都拥有自己的信号编号,通常用一个符号常量来表示,例如SIGTERM。有两种系统事件:异步信号:例如:当用户在终端发送一个中断键,即向前台进程发出一个中断信号SIGINT同步错误或异常:例如:当进程访问内存非法地址时,内核向这个进程发送一个SIGSEGV信号。一般来说进程以两种方式对接受到的信号做出反应:忽略该信号;异步的
2013-09-28 11:02:41 851
原创 unix内核概述-同步和临界区
同步和临界区:实现可重入内核需要同步机制:如果内核控制路径对某个内核数据结构操作时被挂起,那么其他内核控制路径就不应该再对此数据结构操作,除非它已经设为一致性状态。否则两个控制路径交互执行将破坏所存储的信息。一般来说对全局变量的访问通过原子操作来保证。非抢占式内核:这与unix是具有抢占式进程的多处理操作系统并不矛盾。当进程在内核态执行时,他不能被任意挂起,也不能被另一个进程代替。因此
2013-09-28 10:43:18 1046
原创 UNIX内核概述-进程地址空间
每个进程运行在它的私有地址空间。在用户态下运行的进程涉及到私有栈、数据区和代码区。在内核态运行时,进程访问内核的数据区和代码区,单使用另外的私有栈。因为内核是可重入的,因此几个内核控制路径交叉的执行,在这种情况下,每个内核控制路径都有自己的内核栈。尽管看起来每个进程访问一个私有地址空间,但有时进程之间也共享部分地址空间。在一些情况下,这种共享由进程显示的提出;在另一种情况下,有内核自动完成
2013-09-28 09:32:36 980
原创 uniX内核概述-可重入内核
所有的unix内核都是可重入的,这意味着若干个进程可以同时在内核态下执行。在单处理器系统上只有一个进程真正执行,但是有许多进程可能在等待cpu或某一个I/O操作完成时在内核态下被阻塞。例如,当内核代表某一进程发出一个读磁盘的请求后,就让磁盘控制器处理这个请求,并恢复执行其他进程。当设备满足了读请求时,有一个中断就会通知内核,从而恢复以前的进程。提供可重入内核的一种方式就是编写函数,以便这些函数
2013-09-28 00:14:50 1027
原创 UNIX内核概述-进程实现
为了让内核管理进程,每个进程由一个进程描述符表示,这个描述符包含有关进程当前状态信息。当内核暂停一个进程执行时(上下文切换),就把几个相关处理器寄存器的内容保存在进程描述符中。这些寄存器包括:程序计数器PC通用寄存器浮点寄存器包含cpu状态信息的处理器控制寄存器用来跟踪进程对RAM访问的内存管理寄存器当内核决定恢复执行一个进程时,它用进程描述符的字段来装载CPU寄存器。
2013-09-27 23:28:38 643
原创 UNIX内核概述-进程/内核模式
cpu既可以运行在用户态下,也可以运行在内核态。当一个程序在用户态执行时,它不能直接访问内核数据结构或内核的程序。每种CPU模型都提供了从用户态到内核态的转换的特殊指令,反之亦然。一个程序运行时,大部分时间都处于用户态,只有需要内核所提供的服务时才切换到内核态。当内核满足了程序的请求后,它让程序切换到用户态。内核本身并不是一个进程,而是进程管理者。进程/内核模式假定:请求内核服务的进程使用所谓
2013-09-27 23:17:23 1248
原创 插入排序 希尔排序 选择排序 归并排序 堆排序的算法实现,献给面试排序算法的同学们
// soft.cpp : 定义控制台应用程序的入口点。//插入排序 希尔排序 选择排序 归并排序 堆排序的算法实现,献给面试排序算法的同学们#include "stdafx.h"void insert(int a[],int length)//插入排序{for(int i=1;i{int j=i+1;int k=i+1;if(a[j]{a[0]=a[j];while(a[0]{a[k]=a[k-1];
2013-09-27 14:12:56 681
原创 非递归快速排序算法
昨天做人人网笔试题,其中一个就是快排非递归算法,当时考虑的不全面,下面发下正确答案。先说递归算法#include#includeusing namespace std;int partion(int*arr,int p,int r){int key=arr[p];int i=p;for(int j=p+1;j{if(arr[j]{i++;int
2013-09-25 09:26:16 859
转载 Linux用户空间与内核地址空间
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。Linux内核地址映射模型x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存
2013-09-24 16:00:25 6791
原创 C++中的空类,编译器默认可以产生哪些成员函数
C++中的空类,编译器默认可以产生哪些成员函数一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,如果你写 class Empty{}; 就相当于: class Empty { public: Empty(); Empty(const Empty&); ~Empty(); E
2013-09-23 14:03:37 676
原创 I/O模型以及I/O复用
一个简单的服务器端程序:#include "unp.h"int main(int argc,char**argv){int listenfd,connfd;pid_t childpid;socklet_t clilen;struct sockaddr_in cliaddr,servaddr;listenfd=socket(AF_INET,SOCK
2013-09-23 11:20:51 784
原创 java 多线程编程总结
java线程:概念与原理现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线
2013-09-22 17:53:10 591
原创 unix下socket套接口编程详解
先上IPV4套接口的数据结构struct in_addr{in_addr_t s_addr;//32位的ipv4地址}struct sockaddr_in{// ipv4 socket结构uint8_t sin_len//套接口的长度,为了增加osi协议支持随4.3bsd_reno添加的,posix规范也不要求有这个成员,你就当它不存在就可以了。
2013-09-22 15:35:39 1032
原创 java中collection接口下list arraylist vector以及 map接口下的hashmap hashtable详解
collection接口为集合类公共接口,list和map是继承collection接口的接口。list接口下有三个标准模板实现该接口:linklist :标准链表类,由于是链表的结构所以查询慢,单删除和增加都比较快arraylist类:数组类,与vector类似,优点查询快,删除慢,与vector相比,它不是线程安全的,所以,如果不涉及多线程操作,arraylist会比vector快
2013-09-22 11:22:10 742
原创 糊涂窗口综合征详解
什么是糊涂窗口综合症当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之;就会使应用进程间传送的报文段很小,特别是有效载荷很小。 极端情况下,有效载荷可能只有1个字节;而传输开销有40字节(20字节的IP头+20字节的TCP头) 这种现象就叫糊涂窗口综合症发送端引起的糊涂窗口综合症如果发送端为产生数据很慢的应用程序服务(典型的有telne
2013-09-22 11:09:01 1054
转载 实模式和保护模式
一。x86实模式介绍 x86体系的处理器刚开始时只有20根地址线,寻址寄存器是16位。我们知道16位的寄存器可以访问64K的地址空间,如果程序要想访问大于64K的内存,就需要把内存分段,每段64K,用段地址+偏移量的方式来访问,这样使20根地址线全用上,最大的寻址空间就可以到1M字节,这在当时已经是非常大的内存空间了。 二。实模式的问题与保护模式的出现 事实上,
2013-09-18 13:53:40 613
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人